vhxubo's blog
关于

call() apply() and bind()

这三个函数挺有意思的, 每次第一眼看到就会困扰很长时间, 但是一看资料就又懂了, 毕竟在其它地方看到的时候, 都是和其它的杂糅在一起, 而看资料讲的是最基础的

为什么

Use .bind() when you want that function to later be called with a certain context, useful in events. Use .call() or .apply() when you want to invoke the function immediately, and modify the context.

Call/apply call the function immediately, whereas bind returns a function that, when later executed, will have the correct context set for calling the original function. This way you can maintain context in async callbacks and events. https://stackoverflow.com/a/15455043/11485234

call() apply() bind() 这三个东西简单的来说就是控制函数的 this 指向的

call() 的参数是一个一个的

apply() 的参数是一个数组

bind() 相比其它两个是先解决 this, 而后当作正常的 function 进行调用

如何理解

var student = {
name: 'vhxubo'
};

var say = function(begin, end) {
console.log(begin + this.name + end);
}

say.call(student, "Hello ", ".");
say.apply(student, ["Hello ", "."]);

var stu = say.bind(student);
stu("Hello ", ".");

// Hello vhxubo.
// Hello vhxubo.
// Hello vhxubo.

可以发现, 上述的三种方法的输出结果都是一样的

换种思路理解一下

say.call(student, "Hello ", "."); or say.apply(student, ["Hello ", "."]); => student.say("Hello ", ".");

使用 call() 或者 apply() 的第一个参数 (student) 替换最前面的 function (say), 并将 call() 或者 apply() 替换成方法名 (say) , 这种可能会更好理解一些